home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / cdity / ModeProSrc.lha / Daemon / Unnamed1 / 4.1 / MPNodes.c < prev    next >
C/C++ Source or Header  |  1996-06-12  |  2KB  |  84 lines

  1. #include "MP.h"
  2.  
  3. /*
  4.     mprefs will hold a shared lock on ListSem,
  5.     mpatch will obatin a shared lock
  6.     
  7.     RemDNode & AddDNode must get a normal lock
  8. */
  9.  
  10. extern struct MPSem *MPSem;
  11.  
  12. void RemDNode(struct DefaultNode *DN)
  13. {
  14.   if(DN)
  15.   {
  16.     Forbid();
  17.     SendPrefsMsg(MP_LISTSTATUS, MPLS_UPDATING, 0);
  18.     ObtainSemaphore(&MPSem->ListSem); // maybe shared with prefs
  19.     ObtainSemaphore(&MPSem->NodeSem);
  20.     Remove((struct Node *)DN);
  21.     ReleaseSemaphore(&MPSem->NodeSem);
  22.     ReleaseSemaphore(&MPSem->ListSem);
  23.     Permit();
  24.  
  25.     SendPrefsMsg(MP_LISTSTATUS, MPLS_NORMAL, 0);
  26.     SendPrefsMsg(MP_REMNODE,0,DN);
  27.     FreeDNode(DN);
  28.   }
  29. }
  30.     
  31. void AddDNode(ULONG dest, struct DefaultNode *n)
  32. {
  33.   if(dest < 2 && n)
  34.   {
  35.     Forbid();
  36.     SendPrefsMsg(MP_LISTSTATUS, MPLS_UPDATING, 0);
  37.     ObtainSemaphore(&MPSem->ListSem); // maybe shared with prefs
  38.     ObtainSemaphore(&MPSem->NodeSem);
  39.     AddHead(&MPSem->PromotionList[dest],(struct Node *)n);
  40.     n->Depth=max(1,n->Depth);
  41.     ReleaseSemaphore(&MPSem->NodeSem);
  42.     ReleaseSemaphore(&MPSem->ListSem);
  43.     Permit();
  44.  
  45.     SendPrefsMsg(MP_LISTSTATUS, MPLS_NORMAL, 0);
  46.     SendPrefsMsg(MP_NEWNODE,dest,n);
  47.   }
  48.   else
  49.     FreeDNode(n);
  50. }
  51.  
  52. struct DefaultNode *FindDNode(struct List *list,UBYTE *name)
  53. {
  54.   struct DefaultNode *dn;
  55.   UWORD l;
  56.   UBYTE str[128],patsrc[128];
  57.   UBYTE pat[258];
  58.  
  59.  
  60.   
  61.   if(IsListEmpty(list))
  62.   {
  63.     return(NULL);
  64.   }
  65.   for(l=0;l<127 && name[l];l++)
  66.     str[l]=ToUpper(name[l]);
  67.   str[l]=0;
  68.  
  69.   dn=(struct DefaultNode *)list->lh_Head;
  70.   while(dn && dn->Def_Node.ln_Succ!=0)
  71.   {
  72.     for(l=0;l<127 && dn->Def_Node.ln_Name[l];l++)
  73.       patsrc[l]=ToUpper(dn->Def_Node.ln_Name[l]);
  74.     patsrc[l]=0;
  75.       
  76.     ParsePatternNoCase(patsrc,pat,258);
  77.     
  78.     if(MatchPatternNoCase(pat,name))
  79.       return(dn);
  80.     dn=(struct DefaultNode *)dn->Def_Node.ln_Succ;
  81.   }
  82.   return(NULL);
  83. }
  84.